/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.javahispano.javacup.tacticas_aceptadas.maxtor.org.javahispano.javacup.modelo.mio.servicios;

import java.util.*;
import org.javahispano.javacup.modelo.*;
import org.javahispano.javacup.tacticas_aceptadas.maxtor.org.javahispano.javacup.modelo.mio.*;

/**
 *
 * @author Administrador
 */
public class ComandoServiceImpl implements IComandoService {

    // devuelve true si hay pases
    public RespuestaComandos extraerComandos(SituacionPartido sp, RespuestaSituacion res) {

    	ArrayList<Comando> comandosMovimiento = new ArrayList<Comando>();
    	ArrayList<Comando> comandosDisparo = new ArrayList<Comando>();
        
   //     System.out.println("COMANDOSERVICEIMPL COMANDOS");

    	
    	
    	Movimiento movimientos = res.getMovimientos();
    	
    	// movimientos individuales
    	
    	Posicion movPasador = movimientos.getPasador();
    	Posicion movReceptor = movimientos.getReceptor();
    	Posicion movPortero = movimientos.getPortero();
    	
    	Posicion[] movCentrales = movimientos.getCentrales();
    	Posicion[] movLaterales = movimientos.getLaterales();
    	
    	
    	
    	for (int i:UtilEvaluador.INDICE_CENTRALES) {
            if (movCentrales[i]!=null) 
                comandosMovimiento.add(new ComandoIrA(i, movCentrales[i]));
    	}
        for (int i:UtilEvaluador.INDICE_LATERALES) {
            if (movLaterales[i]!=null) comandosMovimiento.add(new ComandoIrA(i, movLaterales[i]));
    	}
    	/*
    	// el destino antiguo tiene prioridad sobre el individual
    	Posicion[] direcciones = ((DatosPartido)DatosPartidoUpdater.getInstance()).getDirecciones();
    	for (int i=0;i<11;i++) {
    		if (direcciones[i]!=null) comandosMovimiento.add(new ComandoIrA(i, direcciones[i]));
    	}
    	*/
    	


    	
    	
    	// el general tiene prioridad sobre el antiguo
    	Posicion[] general = movimientos.getGeneral();
    	for (int i=0;i<11;i++) {
    		if (general[i]!=null)
    			comandosMovimiento.add(new ComandoIrA(i, general[i]));
    	}
    	
    	   	

     	
    	
        Posicion[] destinos = new Posicion[11];
        
        // corregimos la direccion de intercepcion
     	int indice = res.getIndiceReceptor(); 
     	if (indice>-1) {
     		destinos[indice] = movReceptor;
     	}

     	
    	//  el portero mueve de forma independiente salvo en los pases
    	if (movPortero!=null) 	comandosMovimiento.add(new ComandoIrA(0, movPortero));
     	
    	// el pase tiene prioridad sobre el resto de movimientos
        // y se conserva el destino de los jugadores
        Pase pase = res.getPase();
    	if (pase!=null) {
	    	int indicePasador = pase.getIndicePasador(); 
	    	int indiceReceptor = pase.getIndiceReceptor();
	    	if (movPasador!=null) comandosMovimiento.add(new ComandoIrA(indicePasador, movPasador));
	    	if (movReceptor!=null) comandosMovimiento.add(new ComandoIrA(indiceReceptor, movReceptor));
	    	comandosDisparo.add(new ComandoGolpearBalon(pase.getIndicePasador(), pase.getPuntoSeleccionado(), 1, false));
	    	
	    	destinos[pase.getIndicePasador()] = movPasador;
	    	destinos[pase.getIndiceReceptor()] = movReceptor;
	    	
    	}	
        
    	

    	
    	
    	
        // el remate tiene prioridad sobre el pase
    	 Iterator disparos = res.getDisparos().iterator();
         while (disparos.hasNext()) {
             Disparo disparo = (Disparo)disparos.next();
             comandosDisparo.add(new ComandoGolpearBalon(
                                 disparo.getIndiceRematador(),
                                 Constantes.centroArcoSup,
                                 disparo.getFactorRemate(),
                                 disparo.getAnguloRemateVertical()));
             
         }
         if (sp.saco()) {
        	 indice = sp.balon().indiceMasCercano(sp.misJugadores());
        	 destinos[indice] = sp.balon();
         }
        
         
         
     	
     			
     	
     	
         
        RespuestaComandos resComandos = new RespuestaComandos();
        resComandos.setComandosDisparo(comandosDisparo);
        resComandos.setComandosMovimiento(comandosMovimiento);
        resComandos.setDestinoMisJugadores(destinos);
        resComandos.setHayPase(pase!=null);
        resComandos.setIndiceReceptor(pase!=null?pase.getIndiceReceptor():-1);
        return resComandos;
    }

    

}
